<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>反射-Reflect</title>
</head>

<body>
  <script>
    /* 
      反射-Reflect
      向外界暴露了一些底层操作的默认行为，它是一个没有构造函数的内置对象，类似于Math对象，其所有方法都有静态的。
      反射与代理是一一对应的关系
    */

    // 1.参数的检验更为严格
    /* Object.getPrototypeOf("strick") === String.prototype
    Reflect.getPrototypeOf("strick") */

    // 2.更合理的返回值
    var obj = {}
    Object.setPrototypeOf(obj, String) === obj
    Reflect.setPrototypeOf(obj, String)

    // 3.用方法替代运算符
    function func() {}
    new func()
    Reflect.construct(func, [])

    var people = {
      name: "strick"
    }
    "name" in people
    Reflect.has(people, "name")

    delete people["name"]
    Reflect.deleteProperty(people, "name")

    // 4.避免冗长的方法调用，以apply()方法为例
    Function.prototype.apply.call(Math.ceil, null, [2.5])
    Reflect.apply(Math.ceil, null, [2.5])
  </script>
</body>

</html>